﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Diego_Data_Mudanca_Requisito_02
{
	public class business
	{
		public List<DateTime> gerarListaComDiasUteis( DateTime data, int quantidadeDeDias, bool preencherListaComDiasUteis )
		{
			List<DateTime> listaDeDias = null;

			try
			{
				listaDeDias = recuperarDatas( data, quantidadeDeDias, preencherListaComDiasUteis );
			}
			catch( Exception )
			{
				throw;
			}

			return listaDeDias;
		}

		public List<DateTime> recuperarDatas( DateTime dataInicial, int quantidadeDeDias, bool listaComDiasUteis )
		{
			List<DateTime> listaDeDatas = new List<DateTime>();

			int dia = 1;

			while( listaDeDatas.Count != quantidadeDeDias )
			{
				if( verificarData( dataInicial.AddDays( -dia ), quantidadeDeDias, listaComDiasUteis ) )
				{
					if( listaComDiasUteis )
					{
						if( verificarSeDataEFeriado( dataInicial.AddDays( -dia ) ) && verificarSeDataEFinalDeSemana( dataInicial.AddDays( -dia ) ) )
						{
							listaDeDatas.Add( dataInicial.AddDays( -dia ) );
						}
					}
					else
					{
						listaDeDatas.Add( dataInicial.AddDays( -dia ) );
					}
				}


				dia++;
			}

			return listaDeDatas;
		}

		public bool verificarSeDataEFeriado( DateTime dataFinal )
		{
			List<DateTime> listaDeFeriados = recuperarListaDeFeriados();

			if( listaDeFeriados.Contains( dataFinal ) )
			{
				return false;
			}
			else
			{
				return true;
			}
		}

		public bool verificarSeDataEFinalDeSemana( DateTime dataFinal )
		{
			if( dataFinal.DayOfWeek == DayOfWeek.Sunday || dataFinal.DayOfWeek == DayOfWeek.Saturday )
			{
				return false;
			}
			else
			{
				return true;
			}
		}

		private bool verificarData( DateTime dataInicial, int quantidadeDeDias, bool listaComDiasUteis )
		{
			if( dataInicial.Year == DateTime.Now.Year )
			{
				return true;
			}
			else
			{
				gerarExeption( quantidadeDeDias, listaComDiasUteis );
				return false;
			}
		}

		private void gerarExeption( int quantidadeDeDias, bool listaComDiasUteis )
		{
			if( quantidadeDeDias == 7 && listaComDiasUteis )
			{
				throw new Exception( "A data informada não é válida, por isso não foi possível retornar os últimos 7 dias úteis." );
			}
			else if( quantidadeDeDias == 1 && listaComDiasUteis )
			{
				throw new Exception( "Data inválida." );
			}
			else if( quantidadeDeDias == 5 && listaComDiasUteis == false )
			{
				throw new Exception( "Não foi possivel os últimos 5 dias corridos, favor informar uma data válida" );
			}
			else if( quantidadeDeDias == 7 && listaComDiasUteis == false )
			{
				throw new Exception( "Favor informar uma data válida" );
			}
			else if( quantidadeDeDias == 30 && listaComDiasUteis == false )
			{
				throw new Exception( "Impossível recuperar os últimos 30 dias úteis a partir de uma data inválida." );
			}
		}

		//private bool verificarSeEFinalDeSemanaOuFeriado(DateTime item)
		//{
		//    List<DateTime> listaDeFeriados = recuperarListaDeFeriados();

		//    //Verifica se é um feriado
		//    if (listaDeFeriados.Contains(item))
		//    {
		//        return false;
		//    }
		//    else
		//    {
		//        if (item.DayOfWeek == DayOfWeek.Sunday || item.DayOfWeek == DayOfWeek.Saturday)
		//        {
		//            return false;
		//        }
		//        else
		//        {
		//            return true;
		//        }
		//    }
		//}

		private List<DateTime> recuperarListaDeFeriados()
		{
			List<DateTime> listaDeFeriados = new List<DateTime>();
			listaDeFeriados.Add( new DateTime( 2012, 02, 21 ) );
			return listaDeFeriados;
		}
	}
}
